﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using BE_CruzDelSur;
using BR_CruzDelSur;
using BR_CruzDelSur.Interfaces;

namespace WebCruzDelSur
{
    public partial class Metodos : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        [WebMethod(EnableSession = true)]
        public static object ValidarUsuario(string usuario, string pass)
        {
            IBR_Usuario cls_usuario = new BR_Usuario();
            BE_Usuario usu = cls_usuario.f_validaUsuario(usuario, pass);
            
            if (usu == null)
            {
                return "El usuario y/o contraseña es incorrecto";
            }

            HttpContext.Current.Session["EntUsuario"] = usu;
            HttpContext.Current.Session["Usuario"] = "Bienvenido sr(a): " + usu.Nombre;
            HttpContext.Current.Session["Departamento"] = "Agencia: " + usu.NomUbigeo;
            HttpContext.Current.Session["Rol"] = usu.Rol;            
            return usu;
        }

        [WebMethod(EnableSession = true)]
        public static object CerrarSesion()
        {
            HttpContext.Current.Session["EntUsuario"] = null;
            HttpContext.Current.Session["Usuario"] = null;
            HttpContext.Current.Session["Departamento"] = null;
            HttpContext.Current.Session["Rol"] = null;
            return "Se cerró la sesión";
        }

        [WebMethod(EnableSession = true)]
        public static string VerificaSesion()
        {
            if (HttpContext.Current.Session["Usuario"] != null)
                return HttpContext.Current.Session["Usuario"].ToString() + "|" + HttpContext.Current.Session["Departamento"];

            return "";
        }

        [WebMethod(EnableSession = true)]
        public static List<BE_ProgramacionRuta> ObtenerRutasProgramacionRuta(int departamento)
        {
            if (HttpContext.Current.Session["Usuario"] != null)
            {
                BE_Usuario entUsuario = ((BE_Usuario)HttpContext.Current.Session["EntUsuario"]);
                IBR_ProgramacionRuta programacionRuta = new BR_ProgramacionRuta();
                return programacionRuta.f_BuscaProgramacionXDepartamento(entUsuario.CodigoUbigeo, departamento);
            }
            else 
            {
                return new List<BE_ProgramacionRuta>();
            }
        }

        [WebMethod(EnableSession = true)]
        public static List<BE_Carga> ObtenerAsignarCargas(int recojoID)
        {
            if (HttpContext.Current.Session["Usuario"] != null)
            {
                BE_Usuario entUsuario = ((BE_Usuario)HttpContext.Current.Session["EntUsuario"]);
                IBR_Carga carga = new BR_Carga();
                return carga.f_BuscaAsignarCargaPendiente(recojoID);
            }
            else 
            {
                return new List<BE_Carga>();
            }
        }

        [WebMethod]
        public static object CalcularFechaLlegada(int idRuta, string fechaOrigen)
        {
            IBR_Ruta ruta = new BR_Ruta();
            IBR_Util util = new BR_Util();
            BE_Ruta entidad = ruta.f_ObtenerRuta(idRuta);

            if (entidad != null)
            {
                try
                {
                    var horaMinutos = entidad.TiempoEstimado.Trim().Split(':');
                    double horas = util.f_doubleValor(horaMinutos[0]);
                    double minutos = util.f_doubleValor(horaMinutos[1]);
                    var fechaLlegada = util.f_datetimeValor(fechaOrigen).AddHours(horas).AddMinutes(minutos);
                    return fechaLlegada.ToString("dd/MM/yyyy HH:mm");
                }
                catch (Exception ex)
                {
                }
            }
            return "";
        }

        [WebMethod]
        public static List<BE_Ruta> ObtenerRutas()
        {
            IBR_Ruta ruta = new BR_Ruta();
            return ruta.f_ListarRutas();
        }

        [WebMethod]
        public static List<BE_Vehiculo> ObtenerBuses(int idRuta, string fechaOrigen, string fechaDestino, int idProgramacionRuta)
        {
            IBR_Vehiculo vehiculo = new BR_Vehiculo();
            return vehiculo.f_ListarVehiculos(idRuta, fechaOrigen, fechaDestino, idProgramacionRuta);
        }

        [WebMethod]
        public static List<BE_Conductor> ObtenerConductores(int idRuta, string fechaOrigen, string fechaDestino, int idProgramacionRuta)
        {
            IBR_Conductor conductor = new BR_Conductor();
            return conductor.f_ListarConductores(idRuta, fechaOrigen, fechaDestino, idProgramacionRuta);
        }

        [WebMethod]
        public static int GuardarGuiaRemisiom(string codigosCarga)
        {
            IBR_GuiaRemision guiaRemision = new BR_GuiaRemision();
            return guiaRemision.f_InsertarGuiaRemision(codigosCarga);
        }

        [WebMethod]
        public static int GuardarActualizaGuiaRemisiom(string codigosCarga, int codigoGuia)
        {
            IBR_GuiaRemision guiaRemision = new BR_GuiaRemision();
            return guiaRemision.f_ActualizarGuiaRemision(codigosCarga, codigoGuia);
        }
        

        [WebMethod]
        public static List<BE_Carga> ObtenerCargasNuevas(int idProgramacionRuta, string idCogidosCarga)
        {
            IBR_Carga carga = new BR_Carga();
            return carga.f_ListarCargasNuevasProgramacionRuta(idProgramacionRuta, idCogidosCarga);
        }

        [WebMethod]
        public static List<BE_Carga> ObtenerCargasRutaProgramada(int idRutaProgramada)
        {
            IBR_Carga carga = new BR_Carga();
            return carga.f_ListarCargasProgramacionRuta(idRutaProgramada);
        }

        [WebMethod]
        public static List<BE_Carga> ObtenerCargasRutaProgramadaGuiaRemision(int idGuiaRemision)
        {
            IBR_Carga carga = new BR_Carga();
            return carga.f_ListarCargasProgramacionRutaPorGuiaRemision(idGuiaRemision);
        }
        

        [WebMethod]
        public static List<BE_ProgramacionRuta> ObtenerDatosRuta(int idRutaProgramada)
        {
            IBR_ProgramacionRuta programacion = new BR_ProgramacionRuta();
            return programacion.f_BuscaProgramacionParaGuia(idRutaProgramada);
        }

        [WebMethod]
        public static object ValidarCliente(string dniCliente, string origen)
        {
            IBR_Cliente cliente = new BR_Cliente();

            BE_Cliente entCliente = cliente.f_BuscaClienteDNI(dniCliente);

            if (entCliente != null)
                return entCliente;
            else 
            {
                if (dniCliente == "39998815" || dniCliente == "39998816")
                    return "El Número de Documento ingresado no existe en la RENIEC";
                else
                    return "No existe el Cliente en el sistema, por favor registrela";
            }
        }

        [WebMethod]
        public static string EliminarCarga(int codigo)
        {
            IBR_Carga carga = new BR_Carga();
            IBR_Producto producto = new BR_Producto();
            IBR_Pago pago = new BR_Pago();
            
            if (producto.f_EliminarProductos(codigo))
            {
                if (pago.f_EliminarPago(codigo))
                {
                    if (carga.f_eliminarCarga(codigo))
                    {
                        return "1";
                    }                
                }                   
            }
            return "0";
        }

        [WebMethod]
        public static string EliminarRecojo(int codigo)
        {
            IBR_Recojo recojo = new BR_Recojo();

            if (recojo.f_eliminarRecojo(codigo))
            {
                return "1";
            }

            return "0";
        }

        [WebMethod]
        public static string EliminarProgramacionRuta(int codigo)
        {
            IBR_ProgramacionRuta programacionRuta = new BR_ProgramacionRuta();

            if (programacionRuta.f_EliminarProgramacionRuta(codigo))
            {
                return "1";
            }
            return "0";
        }

        [WebMethod]
        public static string CambiarEstadoProgramacionRuta(int codigo, string estado)
        {
            IBR_ProgramacionRuta programacionRuta = new BR_ProgramacionRuta();

            if (programacionRuta.f_ActualizarEstadoProgramacionRuta(codigo, estado))
            {
                return "1";
            }
            return "0";
        }

        [WebMethod]
        public static object VerificarProgramacionRuta(string codigo, string accion, string estado)
        {
            int intCodigo = Convert.ToInt16(codigo);
            IBR_ProgramacionRuta programacionRuta = new BR_ProgramacionRuta();
            BE_ProgramacionRuta entidad = programacionRuta.f_BuscaProgramacionXCodigo(intCodigo);

            if (entidad == null)
                return "No existe la programacion de ruta seleccionada";
            else
            {
                if (accion == "E" || (accion == "CE" && estado == "1"))
                {
                    if (programacionRuta.f_BuscaProgramacionRutaConCarga(intCodigo) > 0)
                    {
                        return "La programacion de ruta no se puede " + (accion == "E" ? "eliminar" : "cambiar de estado") + " ya que tiene cargas relacionadas";
                    }
                }
            }

            return "";
        }
        [WebMethod]
        public static object VerificarGuiaRemision(string codigo)
        {
            IBR_GuiaRemision guia = new BR_GuiaRemision();
            bool estado = guia.f_obtenerGuia(codigo);

            if (!estado)
                return "No existe la guia seleccionada";
            else
            {
                return "";
            }
        }

        [WebMethod]
        public static object EliminarGuiaRemision(string codigo)
        {
            IBR_GuiaRemision guia = new BR_GuiaRemision();
            bool estado = guia.f_eliminarGuia(codigo);

            if (!estado)
                return "Error";
            else
            {
                return "";
            }
        }

        [WebMethod]
        public static object VerificarCarga(string codigo, string accion)
        {
            IBR_Carga carga = new BR_Carga();
            BE_Carga entidad = carga.f_obtenerCarga(codigo);

            if (entidad == null)
                return "No existe la carga seleccionada";
            else
            {
                if (accion == "E")
                {
                    if (entidad.EstadoCarga == "IN")
                        return "";
                    else
                        return "La carga no se puede eliminar la carga ya que no se encuentra iniciada";
                }
                else {
                    if (entidad.EstadoCarga != "ET")
                        return "";
                    else
                        return "La carga no se puede actualizar la carga ya que se encuentra entregada";
                }
            }
        }


        [WebMethod]
        public static string VerificarCodigoSeguridad(string codigo, string codigoSeguridad, string DNIDestino)
        {
            IBR_Carga carga = new BR_Carga();
            IBR_Pago pago = new BR_Pago();

            bool entidad = carga.f_VerificarCargaXCodigoSeguridad(codigo, codigoSeguridad, DNIDestino);

            if (entidad == false)
                return "0";

            BE_Carga entCarga = carga.f_obtenerCarga(codigo);

            //Si el tipo de pago es de origen sera en blanco, sino enviará 1, enviará 0 cuando sea incorrecto el código
            string resultado = (entCarga.TipoPago == 1 ? "" : "1");

            if (resultado == "")
            {
                BE_Pago entPago = pago.f_obtenerPagoXCarga(codigo);
                if (entPago.Estado == "PE")
                    return "2";
                else
                    return "";
            }
            else
            {
                BE_Pago entPago = pago.f_obtenerPagoXCarga(codigo);
                if (entPago == null)
                {
                    pago.f_InsertarPago(Metodos.f_calculaMonto(entCarga), "PE", codigo);
                    return "1";
                }
                else if (entPago.Estado == "PE")
                    return "2";
                else
                    return "";
            }
        }

        [WebMethod]
        public static void ActualizarEstado(string codigo)
        {
            IBR_Carga carga = new BR_Carga();
            carga.f_ActualizarEstado(codigo, "ET");
        }

        public const double costo_minimo = 20;
        const double carga_fragil = 0.10;
        const double servicio_express = 0.20;
        const double costo_peso = 10;
        const double costo_medida = 1.2;

        public static double f_calculaMonto(BE_Carga entidad)
        {
            double total = (entidad.Peso * costo_peso) + (entidad.Profundidad * entidad.Largo * entidad.Ancho * costo_medida);

            if (entidad.TipoCarga == 3)
                total = total + total * carga_fragil;

            if (entidad.ProgramacionRuta.TipoServicio == "EXPRESS")
                total = total + total * servicio_express;

            if (total < costo_minimo)
                total = costo_minimo;

            return total;
        }

        [WebMethod]
        public static void GeneraOrden(string codigo)
        {
            IBR_Carga carga = new BR_Carga();
            IBR_Pago pago = new BR_Pago();
            BE_Carga entidad = carga.f_obtenerCarga(codigo);
            double total = f_calculaMonto(entidad);

            pago.f_InsertarPago(total, "PE", codigo);
        }




    }
}